#pragma once

#include <atomic>
#include <memory>

namespace base::tasking {

/**
 * @brief 取消令牌 - 用于协作式任务取消
 *
 * 设计要点:
 * - 使用 std::atomic<bool> 保证线程安全
 * - 支持多个任务共享同一个取消令牌
 * - 取消操作是单向的(不可恢复)
 * - 使用 memory_order_release/acquire 保证内存可见性
 */
class CancellationToken {
public:
    CancellationToken() = default;
    ~CancellationToken() = default;

    // 禁止拷贝,允许移动
    CancellationToken(const CancellationToken&) = delete;
    CancellationToken& operator=(const CancellationToken&) = delete;
    CancellationToken(CancellationToken&&) = default;
    CancellationToken& operator=(CancellationToken&&) = default;

    /**
     * @brief 请求取消操作
     *
     * 设置取消标志为true。这是单向操作,一旦设置无法恢复。
     * 使用 memory_order_release 确保之前的所有操作对其他线程可见。
     */
    void request() {
        m_canceled.store(true, std::memory_order_release);
    }

    /**
     * @brief 检查是否已请求取消
     *
     * @return true 已请求取消
     * @return false 未请求取消
     *
     * 使用 memory_order_acquire 确保能看到其他线程的 request() 操作。
     */
    bool isCanceled() const {
        return m_canceled.load(std::memory_order_acquire);
    }

    /**
     * @brief 重置取消状态(仅用于测试)
     *
     * 注意: 生产代码不应使用此方法,因为取消应该是单向的。
     * 此方法仅用于单元测试中复用 CancellationToken 对象。
     */
    void reset() {
        m_canceled.store(false, std::memory_order_release);
    }

private:
    std::atomic<bool> m_canceled{false};
};

using CancellationTokenPtr = std::shared_ptr<CancellationToken>;

} // namespace base::tasking
